home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / libraries / newiff.lha / NewIFF / NewIFF39.lha / newiff39 / apps / ScreenSave / ScreenSave.c < prev    next >
C/C++ Source or Header  |  1993-09-28  |  8KB  |  289 lines

  1. /* ScreenSave
  2.  * Saves front screen as an ILBM
  3.  * Requires linkage with several iffparse modules - See Makefile
  4.  * 39.10 - add NOMONITOR keyword 
  5.  */ 
  6. #define INTUI_V36_NAMES_ONLY
  7.  
  8. #include "iffp/ilbmapp.h"
  9.  
  10. #include <intuition/intuitionbase.h>
  11. #include <workbench/workbench.h>
  12. #include <graphics/gfxbase.h>
  13.  
  14. #include <clib/icon_protos.h>
  15.  
  16.  
  17. #ifdef __SASC
  18. void __chkabort(void) {}          /* Disable SAS CTRL-C checking. */
  19. #else
  20. #ifdef LATTICE
  21. void chkabort(void) {}            /* Disable LATTICE CTRL-C checking */
  22. #endif
  23. #endif
  24.  
  25.  
  26. #include "screensave_rev.h"
  27. UBYTE vers[] = VERSTAG;
  28. UBYTE Copyright[] = VERS " - Saves screen as ILBM - Freely Redistributable";
  29.  
  30. char *usage =
  31.  "Usage: screensave filename (filename -c[unit] for clipboard)\n" 
  32.  "Opts: QUIET NODELAY NOICON NOMONITOR VIEWPORT SEQUENCE (adds number to name)\n"
  33.  "Saves front screen (or ViewPort) after 10-sec delay (unless NODELAY).\n";
  34.  
  35. int mygets(char *s);
  36. void bye(UBYTE *s,int e);
  37. void cleanup(void);
  38.  
  39. struct Library    *IntuitionBase = NULL;
  40. struct Library    *GfxBase = NULL;
  41. struct Library    *IconBase = NULL;
  42. struct Library    *IFFParseBase = NULL;
  43.  
  44. struct ILBMInfo ilbm = {0};
  45.  
  46. BOOL fromWB, Quiet, NoDelay, NoIcon, Sequence, FrontVP, NoMonitor;
  47.  
  48.  
  49.  
  50. #define INBUFSZ 128
  51. char nbuf[INBUFSZ];
  52.  
  53. /* Data for project icon for saved ILBM
  54.  *
  55.  */
  56. UWORD ILBMI1Data[] =
  57. {
  58. /* Plane 0 */
  59.     0x0000,0x0000,0x0000,0x0001,0x0000,0x0000,0x0000,0x0003,
  60.     0x0FFF,0xFFFF,0xFFFF,0xFFF3,0x0FFF,0x0000,0x0000,0xFFF3,
  61.     0x0FFC,0x0000,0x0000,0x3FF3,0x0FE0,0x0E80,0xF800,0x07F3,
  62.     0x0F80,0x1C01,0x8C00,0x01F3,0x0F00,0x0001,0x8C00,0x00F3,
  63.     0x0600,0x0000,0x0600,0x0063,0x0600,0x0003,0xBC00,0x0063,
  64.     0x0600,0x0001,0xFC00,0x0063,0x0600,0x0000,0xFC00,0x0063,
  65.     0x0600,0x1FC1,0xFE40,0x0063,0x0600,0x1DC1,0xFE20,0x0063,
  66.     0x0600,0x1CE3,0xFF12,0x0063,0x0F00,0x1CE0,0x004F,0xC0F3,
  67.     0x0F80,0x1CE0,0x002F,0x01F3,0x0FE0,0x0E78,0x423D,0x07F3,
  68.     0x0FFC,0x0000,0x0000,0x3FF3,0x0FFF,0x0000,0x0000,0xFFF3,
  69.     0x0FFF,0xFFFF,0xFFFF,0xFFF3,0x0000,0x0000,0x0000,0x0003,
  70.     0x7FFF,0xFFFF,0xFFFF,0xFFFF,
  71. /* Plane 1 */
  72.     0xFFFF,0xFFFF,0xFFFF,0xFFFE,0xD555,0x5555,0x5555,0x5554,
  73.     0xD000,0x0000,0x0000,0x0004,0xD3FC,0xFFFF,0xFFFF,0x3FC4,
  74.     0xD3C0,0x0000,0x0000,0x03C4,0xD300,0x0100,0xF800,0x00C4,
  75.     0xD300,0x0381,0xFC00,0x00C4,0xD080,0x0701,0xFC00,0x0104,
  76.     0xD180,0xF883,0xFE00,0x0194,0xD181,0xDF80,0x4700,0x0194,
  77.     0xD181,0xDF82,0x0180,0x0194,0xD180,0x6F82,0x00C0,0x0194,
  78.     0xD180,0x0002,0x0020,0x0194,0xD180,0x0000,0x0000,0x0194,
  79.     0xD180,0x0000,0x0002,0x0194,0xD080,0x0000,0xCC46,0xC104,
  80.     0xD300,0x0000,0xCC2F,0x00C4,0xD300,0x0E78,0x883D,0x00C4,
  81.     0xD3C0,0x0000,0x0000,0x03C4,0xD3FC,0xFFFF,0xFFFF,0x3FC4,
  82.     0xD000,0x0000,0x0000,0x0004,0xD555,0x5555,0x5555,0x5554,
  83.     0x8000,0x0000,0x0000,0x0000,
  84. };
  85.  
  86. struct Image ILBMI1 =
  87. {
  88.     0, 0,            /* Upper left corner */
  89.     64, 23, 2,            /* Width, Height, Depth */
  90.     ILBMI1Data,            /* Image data */
  91.     0x0003, 0x0000,        /* PlanePick, PlaneOnOff */
  92.     NULL            /* Next image */
  93. };
  94.  
  95. UBYTE *ILBMTools[] =
  96. {
  97.     "FILETYPE=ILBM",
  98.     NULL
  99. };
  100.  
  101. struct DiskObject ILBMobject =
  102. {
  103.     WB_DISKMAGIC,        /* Magic Number */
  104.     WB_DISKVERSION,        /* Version */
  105.     {                /* Embedded Gadget Structure */
  106.     NULL,            /* Next Gadget Pointer */
  107.     0, 0, 64, 24,        /* Left,Top,Width,Height */
  108.     GFLG_GADGIMAGE | GADGBACKFILL,            /* Flags */
  109.     GACT_RELVERIFY | GACT_IMMEDIATE,    /* Activation Flags */
  110.     GTYP_BOOLGADGET,                /* Gadget Type */
  111.     (APTR)&ILBMI1,    /* Render Image */
  112.     NULL,            /* Select Image */
  113.     NULL,            /* Gadget Text */
  114.     NULL,            /* Mutual Exclude */
  115.     NULL,            /* Special Info */
  116.     0,            /* Gadget ID */
  117.     NULL,            /* User Data */
  118.     },
  119.     WBPROJECT,            /* Icon Type */
  120.     "Display",            /* Default Tool */
  121.     ILBMTools,            /* Tool Type Array */
  122.     NO_ICON_POSITION,        /* Current X */
  123.     NO_ICON_POSITION,        /* Current Y */
  124.     NULL,            /* Drawer Structure */
  125.     NULL,            /* Tool Window */
  126.     0                /* Stack Size */
  127. };
  128.  
  129.  
  130.  
  131. void main(int argc, char **argv)
  132.    {
  133.    struct View     *frontview;
  134.    struct ViewPort *frontvp;
  135.    struct BitMap   *frontbitmap;
  136.    UWORD       *frontcolortable;
  137.    struct Screen   *frontScreen;
  138.    LONG        error = 0L, seqlock;
  139.    char         *filename;
  140.    int l, k;
  141.  
  142.    fromWB = (argc==0) ? TRUE : FALSE;
  143.  
  144.  
  145.    if(!(IntuitionBase = OpenLibrary("intuition.library", 0)))
  146.       bye("Can't open intuition library.\n",RETURN_WARN);
  147.       
  148.    if(!(GfxBase = OpenLibrary("graphics.library",0)))
  149.       bye("Can't open graphics library.\n",RETURN_WARN);
  150.  
  151.    if(!(IFFParseBase = OpenLibrary("iffparse.library",0)))
  152.       bye("Can't open iffparse library.\n",RETURN_WARN);
  153.  
  154.    if(!(IconBase = OpenLibrary("icon.library",0)))
  155.       bye("Can't open icon library.\n",RETURN_WARN);
  156.  
  157.    if(!(ilbm.ParseInfo.iff = AllocIFF()))
  158.       bye(IFFerr(IFFERR_NOMEM),RETURN_WARN);
  159.  
  160.    if(argc>1)                 /* Passed filename via command line  */
  161.       {
  162.       if(argv[1][0]=='?') 
  163.         {
  164.         printf("%s\n%s\n",Copyright,usage);
  165.         bye("\n",RETURN_OK);
  166.         }
  167.       else filename = argv[1];
  168.  
  169.       NoDelay = NoIcon = Quiet = Sequence = FrontVP = FALSE;
  170.       for(k=2; k < (argc); k++)
  171.     {
  172.     if(!(stricmp(argv[k],"NODELAY")))     NoDelay  = TRUE;
  173.     else if(!(stricmp(argv[k],"NOICON")))     NoIcon   = TRUE;
  174.     else if(!(stricmp(argv[k],"NOMONITOR"))) NoMonitor= TRUE;
  175.     else if(!(stricmp(argv[k],"QUIET")))     Quiet    = TRUE;
  176.     else if(!(stricmp(argv[k],"SEQUENCE")))     Sequence = TRUE;
  177.     else if(!(stricmp(argv[k],"VIEWPORT")))  FrontVP = TRUE;
  178.     }
  179.       if(NoMonitor)    ilbm.IFFPFlags |= IFFPF_NOMONITOR;
  180.       if(Sequence)
  181.     {
  182.     for(k=1; k<9999; k++)
  183.         {
  184.         sprintf(nbuf,"%s%04ld",filename,k);
  185.         if(seqlock = Lock(nbuf,ACCESS_READ))    UnLock(seqlock);
  186.         else break;
  187.         }
  188.     filename = nbuf;
  189.     }
  190.       }
  191.    else
  192.       {
  193.       printf("%s\n%s\n",Copyright,usage);
  194.       printf("Enter filename for save: ");
  195.       l = mygets(&nbuf[0]);
  196.  
  197.       if(l==0)                /* No filename - Exit */
  198.          {
  199.          bye("\nScreen not saved, filename required\n",RETURN_FAIL);
  200.          }
  201.       else
  202.          {
  203.          filename = &nbuf[0];
  204.          }
  205.       }
  206.      
  207.    if(!NoDelay)    Delay(500);
  208.  
  209.    Forbid();
  210.    frontScreen  = ((struct IntuitionBase *)IntuitionBase)->FirstScreen;
  211.    Permit();
  212.  
  213.  
  214.    if(FrontVP)
  215.     {
  216.     frontview = ((struct GfxBase *)GfxBase)->ActiView;
  217.     frontvp = frontview->ViewPort;
  218.     while((frontvp->Next)&&(frontvp->Modes & VP_HIDE))
  219.         frontvp = frontvp->Next;
  220.     frontbitmap = frontvp->RasInfo->BitMap;
  221.     frontcolortable = frontvp->ColorMap->ColorTable;
  222.     if(error = saveilbm(&ilbm,
  223.                 frontbitmap, (ULONG)frontvp->Modes,
  224.                 frontvp->DWidth, frontbitmap->Rows,
  225.                 frontvp->DWidth, frontbitmap->Rows,
  226.                 frontcolortable, frontvp->ColorMap->Count, 4,
  227.                 0, 0,
  228.                 NULL,NULL,
  229.                 filename))
  230.     printf("%s\n",IFFerr(error));
  231.     }
  232.    else if(error = screensave(&ilbm, frontScreen,
  233.                 NULL, NULL,
  234.                 filename))
  235.     {
  236.     printf("%s\n",IFFerr(error));
  237.     }
  238.  
  239.    if(! error)
  240.     {
  241.           if(!Quiet) printf("%s saved as %s... ",
  242.             FrontVP ? "Viewport" : "Screen",filename);
  243.     if((!NoIcon)&&(filename[0]!='-')&&(filename[1]!='c')) /* not clipboard */
  244.         {
  245.               if(!(PutDiskObject(filename,&ILBMobject)))
  246.                 {
  247.                 bye("Error saving icon\n",RETURN_WARN);
  248.                 }
  249.            if(!Quiet) printf("Icon saved\n");
  250.         }
  251.     else if(!Quiet) printf("\n");
  252.           bye("",RETURN_OK);
  253.           }
  254.     }
  255.  
  256.  
  257. void bye(UBYTE *s,int e)
  258.    {
  259.    if(s&&(*s)) printf("%s\n",s);
  260.    if ((fromWB)&&(*s))    /* Wait so user can read messages */
  261.       {
  262.       printf("\nPRESS RETURN TO EXIT\n");
  263.       mygets(&nbuf[0]);
  264.       }
  265.    cleanup();
  266.    exit(e);
  267.    }
  268.  
  269. void cleanup()
  270.    {
  271.    if(ilbm.ParseInfo.iff)    FreeIFF(ilbm.ParseInfo.iff);
  272.  
  273.    if(GfxBase)        CloseLibrary(GfxBase);
  274.    if(IntuitionBase)    CloseLibrary(IntuitionBase);
  275.    if(IconBase)        CloseLibrary(IconBase);
  276.    if(IFFParseBase)    CloseLibrary(IFFParseBase);
  277.    }
  278.  
  279.  
  280. int mygets(char *s)
  281.    {
  282.    int l = 0, max = INBUFSZ - 1;
  283.  
  284.    while (((*s = getchar()) !='\n' )&&(l < max)) s++, l++;
  285.    *s = NULL;
  286.    return(l);
  287.    }
  288.  
  289.